.. _cmmCfgSetSoftLimit: cmmCfgSetSoftLimit ======================== ------------------------ SYNOPSYS ``````````` .. code-block:: none VT_I4 cmmCfgSetSoftLimit( [in] VT_I4 Axis, [in] VT_I4 IsEnable, [in] VT_R8 LimitN, [in] VT_R8 LimitP ) DESCRIPTION ````````````` - 이 함수는 소프트웨어 리밋(Limit) 기능을 활성 또는 비활성화 하고 소프트웨어 리밋 범위를 설정합니다. 소프트웨어적인 Limit 은 리밋센서의 설치가 용이하지 않을 때 안전성을 위하여 소프트웨어적인 리미트를 설정하는 것입니다. 소프트웨어적인 Limit 은 Command pulse 카운터의 절대값이 지정한 +/- Limit 값보다 같거나 크게 되면 모션을 자동 정지하도록 합니다. PARAMETER ````````````` - Axis : 축번호. 축 번호는 0 부터 시작합니다. \ - IsEnable : cmmCfgSetSoftLimit 함수의 인자이며, 소프트웨어 리밋(Limit) 기능의 활성화 여부를 설정합니다. \ - LimitN : cmmCfgSetSoftLimit 함수의 인자이며, (-) 방향 Limit 값을 설정합니다. \ - LimitP : cmmCfgSetSoftLimit 함수의 인자이며, (+) 방향 Limit 값을 설정합니다. REFERENCE ``````````` - S/W Limit 의 설정에는 항상 Unit Distance 의 값이 고려되지 않는 상황에서 문제가 발생할 수 있습니다. 만약 설정한 Unit Distance 값이 1000 으로 설정되어 있다면, 이 값에 입력된 LimitN 값과 LimitP 값이 28Bit 로 표현할 수 있는 정수값을 초과해서는 안됩니다. 이 내용을 식으로 표현하면 다음과 같습니다. Unit Distance * S/W Limit Value < 268,435,456(28bit 정수) 위 의미는 결국 Unit Distance 와 S/W Limit 의 변수값이 28bit 정수보다 작아야 한다는 의미입니다. 본 함수의 인자가 Double 형이라고 할지라도 이 점을 반드시 주의해주시기 바랍니다. 만약 이 값이 28Bit 정수보다 크게 되면, 변수의 값이 Overflow 되어 내부에서 Negative Limit 이 Positive Limit 효과를 가져와, 모터의 축이 +/- 방향으로 움직이지 못하는 현상을 발생시킬 수 있습니다. .. warning:: 소프트웨어 Limit 은 논리적으로 하드웨어적인 Limit 과 동일하게 동작합니다. 또한 Negative Limit 과 Positive Limit 값은 Unit Distance 를 고려하여, 입력값의 Overflow 를 주의해야 합니다. EXAMPLE ````````` .. code-block:: c++ :linenos: :emphasize-lines: 5 C/C++ #include “Cmmsdk.h” #include “CmmsdkDef.h” long nAxisNo = 1; // Software Limit 을 설정할 축을 선택합니다. void OnSetSoftLimit () { long nIsEnable; // Software Limit 정보. double fElNeg, fElPos; /* Software Limit 설정 상태를 확인하고, Software Limit 기능이 비활성 상태이면 활성 상태로 설정합니다. */ if (cmmCfgGetSoftLimit ( nAxisNo, &nIsEnable, &fElNeg, &fElPos ) == cmERR_NONE ) { if ( nIsEnable != cmTRUE) { // Software Limit 기능을 활성화 하고, -EL 은 -100000, +EL 은 100000 으로 설정합니다. cmmCfgSetSoftLimit ( nAxisNo, cmTRUE, -100000, 100000 ); } } } void OnMove () { /* 현재 위치 : 50000 이라 가정, 이송 거리 : 100000 으로 이송 명령을 주면 SW Limit 이송 제한 범위에 걸려 150000 까지 Command pulse 를 출력하지 못하고 100000 위치에서 자동으로 정지합니다. */ cmmSxMoveStart ( nAxisNo, 100000 ); } .. code-block:: none :linenos: Visual Basic Private Sub OnSetSoftLimit () Dim nIsEnable As Long ‘ Software Limit 정보. Dim fElNeg As Double, fElPos As Double ‘ Software Limit 설정 상태를 확인하고, Software Limit 기능이 비활성 상태이면 활성 상태로 설정합니다. If cmmCfgGetSoftLimit (cmX1, nIsEnable, fElNeg, fElPos ) = cmERR_NONE Then If nIsEnable <> cmTRUE Then ‘ Software Limit 기능을 활성화 하고, -EL 은 -100000, +EL 은 100000 으로 설정합니다. Call cmmCfgSetSoftLimit (cmX1, cmTRUE, -100000, 100000 ) End If End If End Sub Private Sub OnMove () ‘ 현재 위치 : 50000 이라 가정, 이송 거리 : 100000 으로 이송 명령을 주면 SW Limit 이송 제한 범위에 걸려 ‘ 150000 까지 Command pulse 를 출력하지 못하고 100000 위치에서 자동으로 정지합니다. Call cmmSxMoveStart (cmX1, 100000 ) End Sub .. code-block:: none :linenos: Delphi procedure OnSetSoftLimit (); var nIsEnable : LongInt; // Software Limit 정보. fElNeg, fElPos : Double; begin // Software Limit 설정 상태를 확인하고, Software Limit 기능이 비활성 상태이면 활성 상태로 설정합니다. if cmmCfgGetSoftLimit (cmX1, @nIsEnable, @fElNeg, @fElPos ) = cmERR_NONE then begin if nIsEnable <> cmTRUE then // Software Limit 기능을 활성화 하고, -EL 은 -100000, +EL 은 100000 으로 설정합니다. cmmCfgSetSoftLimit (cmX1, cmTRUE, -100000, 100000 ); end; end; procedure OnMove (); begin { 현재 위치 : 50000 이라 가정, 이송 거리 : 100000 으로 이송 명령을 주면 SW Limit 이송 제한 범위에 걸려 150000 까지 Command pulse 를 출력하지 못하고 100000 위치에서 자동으로 정지합니다. } cmmSxMoveStart (cmX1, 100000 ); end; .. seealso:: :ref:`cmmCfgGetSoftLimit`